//
//  main.c
//  进制查表法优化
//
//  Created by szcq on 2021/4/23.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    void printSystem(int value,int base,int offset);
    printSystem(10, 1, 1);
    printSystem(10, 7, 3);
    printSystem(10, 15, 4);
    
    return 0;
}


/// 打印进制的值
/// @param value value
/// @param base 按位与 的数值   2进制：1  ;     8进制：7;      16进制 ：  15
/// @param offset 右移的数值   2进制：1  ;     8进制：3;      16进制 ：  4
void printSystem(int value,int base,int offset) {
    
    // 1.定义十六进制的进制表（ 包括 八进制和 二进制的表）  一定要按照顺序
    char form[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    // 2.定义接受 进制  的字符数组
    char charValues[32] = {'0'};// 二进制一共 32位[32],3个 二进制 => 1个 八进制 [11];4个 二进制 => 1个 十六进制[4]
    // 3.定义 接受 十六进制 字符的 索引，从低位开始
    int index = 32;
    
    while (value != 0) {
        // 4.1  将传进来的value & base，获取到 对应 form 的索引值
        int res = value & base;
            // 15 : 00000000 00000000 00000000 0000 1111
            //  7 : 00000000 00000000 00000000 0000 0111
            //  1 : 00000000 00000000 00000000 0000 0001
        // 4.2  将得到的索引值 根据 form 里的元素 去除对应的字符
        char destinationValue = form[res];
        index -- ;
        charValues[index] = destinationValue;
        //4.3 将传进来的值  右移 offset 为
        value = value >> offset;
    }
    // 4.打印结果
    for (int i = index; i < 32; i++) {
        printf("%c", charValues[i]);
    }
    //输出结果 : 12
    printf("\n");
}
